#!/bin/bash
###########################################
## 功能：自动的将应用程序产生的日志同步到 flume 配置指定的目录下(本地)
## 用法：直接部署 crontab 或者本地 debug：bash -x cpM_trackToFlume.sh [N]
## 注意 1：需要自行修改 dt10MinsAgo1、filePrefix、srcDataPath、dstDataPath 等配置化参数
## 注意 2：logs 目录需要自己手动创建！命令：mkdir -p logs
## crontab 部署方式：logs 目录需要自己手动创建！
## create: 2015-08-05
###########################################

. /etc/profile

[[ 10#`date +'%H%M'` -eq 10 ]] && exit 1

time=`date +%Y%m%d`
time1=`date +%Y-%m-%d`

hourMin=`date +%H%M`
dt1=`date +%Y%m%d -d'1 days ago'`
dt2=`date +%Y-%m-%d -d'1 days ago'`

if [[ -z $1 ]]
then
    # 根据你的日志生成间隔时间，设置此数值
    minInterval=10
else
    # 间隔 N 分钟：手动传入参数 $1，作为测试接口或者重传历史数据：bash -x cpM_trackToFlume.sh 12
    minInterval=$1
fi
dt10MinsAgo1=`date +'%Y-%m-%d-%H-%M' -d"$minInterval minutes ago"`

# 超时 N 秒
timeOut=3600
# 文件名固定部分
filePrefix=api_response.access.log
# 源文件路径
#srcDataPath=/usr/share/nginx/logs
srcDataPath=/data3/logs/nginx/accesslog

#src tmp 
srcFileTmp=/data3/logs/nginx/accesslog/api_response

echo $srcFileTmp

# 目的拷贝路径：与 hdfs 上的目录一致，不用带日期
dstDataPath=/data3/logs/flume/spooling/arr/api_response
# 获取当前机器的 eth0 网卡（内网）IP 地址，一般不需要你修改，除非多网卡场景
eth0IP=`ip a 2>/dev/null|grep 'eth0$'|grep -Po '((\d{1,3}.){3}\d{1,3})(?=/)'`

# 请手动创建日志目录：logs
#logsPath=logs
#[[ -d $logsPath ]] || mkdir -p $logsPath

#会自动创建 flume/hdfs 日期归档文件夹
[[ -d $dstDataPath/$time ]] || mkdir -p $dstDataPath/$time

getFileSize(){
    sSzie=`ls -l $srcFileTmp|awk -F" " '{print $5}'`
}

logFile(){
    dSize=`ls -l $dstFile|awk -F" " '{print $5}'`
    dateTime=`date +'%F %T'`
    #echo $dateTime" "$srcFileTmp" "$sSzie$'\t'$dstFile" "$dSize" is mv SUCCESS..."
	echo "["$dateTime"]"
	echo "$srcFileTmp $sSzie
		  $dstFile $dSize"|column -t
}

datatmppath=$srcFileTmp/$dateDir

mkdir -p $datatmppath

chkFileWriteOver(){
    while [[ $c -lt $timeOut ]]
    do  
        ((c++))
        fileName=$1
        dateDir=$2
        cd $srcDataPath/$dateDir
        srcFile=$srcDataPath/$dateDir/$fileName
	
	    srcFileTmp_mv=$datatmppath/$fileName
	    dstFile=$dstDataPath/$eth0IP"_"$fileName
        # 如果文件长度大于 0，继续检查文件是否有写锁，或者句柄都已释放
        [[ -e $srcFile && -s $srcFile ]] || { sleep 1; continue; }
        lsof $srcFile
        # 如果文件没有被锁，或者句柄都释放了，就可以开始拷贝了
        # 注意：此处要先 cp，再 mv，防止大文件 cp 的时候同时被其它进程读取，造成读取的数据不完整
        [[ $? -eq 1 ]] && cp -f $srcFile $srcFileTmp_mv && getFileSize && mv -f $srcFileTmp_mv $dstFile && logFile && break
        sleep 1
    done
    # 如果文件在 timeOut 时间内还没有传送成功，那就发个告警吧~
    [[ $c -ge $timeOut ]] && echo `date +'%F %T'`" "$srcFile" is Exception ..." && sendSMS "$srcFile retry $c times, and it's Exception!"
}

# 0 点 0 分是拷贝昨天的 23:50 分产生的日志到前一天的文件夹中
if [[ 0 -eq 10#$hourMin ]]
then
    chkFileWriteOver ${filePrefix}.${dt10MinsAgo1} $dt1
else
    chkFileWriteOver ${filePrefix}.${dt10MinsAgo1} $time
fi


#chkFileWriteOver ${filePrefix}.${dt10MinsAgo1} $time
